行操作

与DataFrame的列操作类似,行操作同样包括增、删、改、查,即添加行、插入行、删除行、修改行名、修改行数据、查找行、选择行等基本操作。[大谦Excel,dqexcel点com]

直接添加一个新行

【问题描述】

在DataFrame的底部直接添加一个新行。

【示例3-20】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/02 行操作/01 直接添加一个新行/水果销量.xlsx”。该文件打开后如图3-15所示,是各种水果本次和上次的销量。要求用pandas导入Excel文件的数据。在导入的数据下面添加一行,品种为苹果,本次销量为99,上次销量为80。

Document Image

图3-15 水果销售数据

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/02 行操作/01 直接添加一个新行/水果销量.xlsx', engine='openpyxl')
# 添加新行
new_row = {'品种': '苹果', '本次销量': 99, '上次销量': 80}
df = df.append(new_row, ignore_index=True)
# 输出修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加行后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   品种  本次销量  上次销量
0  苹果   100     0
1  苹果    56   100
2  香蕉   150     0
3  樱桃   110     0
4  芒果    15     0
5  苹果    70    56
6  芒果    86    15
7  樱桃    99   110
8  苹果    99    80

【知识点扩展】

本例中用DataFrame的append方法追加一个新行。关于append方法,在第4章介绍追加DataFrame时会详细介绍。

实际上,可以用类似下面的代码直接向指定DataFrame添加行。

code.python
df.loc[8]=['苹果',99,80]

即指定df第9行的数据为['苹果',99,80]。

已有行计算得到新行

【问题描述】

利用DataFrame中已有行数据进行计算得到新行。

【示例3-21】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/02 行操作/02 已有行计算得到新行/考试成绩.xlsx”。该文件打开后如图3-16所示,是某班同学不同科目的考试成绩。要求用pandas导入Excel文件的前12行数据,计算该班每门课的平均成绩,即计算每列数据的均值。

Document Image

图3-16 某班同学不同科目的考试成绩

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件中第一个工作表的前12行数据,将“姓名”列作为索引列,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/02 行操作/02 已有行计算得到新行/考试成绩.xlsx', engine='openpyxl', index_col='姓名', nrows=12)
# 计算每门课的平均成绩,将结果向下取整,并添加到数据表最后一行
df.loc['平均成绩'] = df.mean().astype(int)
# 显示修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加“平均成绩”行后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
       语文   数学   英语  政治  历史
姓名
徐慧     85   54   92  50  90
王慧琴    90   73  118  89  77
章思思    95   83   62  49  49
阮锦绣    92   91   89  84  74
周洪宇    93   92  113  66  66
谢思明    98   95  117  73  73
程成     98   95  114  80  70
王洁    102  102  136  73  72
张丽君   107   96  105  59  59
马欣    104  112  124  77  85
焦明     96  116   99  74  74
王艳     88  118  103  87  67
平均成绩   95   93  106  71  71

【知识点扩展】

本例中直接使用DataFrame对象的统计方法计算科目成绩的均值,即

df.loc['平均成绩'] = df.mean().astype(int)

也可以使用DataFrame对象的apply方法和agg方法对列求和,例如:

code.python
df.loc['平均成绩']=df.apply(np.sum)
df.loc['平均成绩']=df.agg('sum')

注意,apply方法这里使用的是NumPy中的sum函数,使用前需要先导入NumPy包,即

code.python
import numpy as np

利用DataFrame中某已有行的数据得到新行,也可以使用Series对象的apply方法、map方法和transform方法。

例如下面三行代码实现在df中’b’行数据的基础上乘以1.2得到新行’d’。

code.python
df.loc['d']=df.loc['b'].apply(lambda x:x*1.2)
df.loc['d']=df.loc['b'].map(lambda x:x*1.2)
df.loc['e']=df.loc['c'].transform(lambda x:x*1.2)

插入行

【问题描述】

在DataFrame中指定位置插入一个新行。

【示例3-22】

本例使用示例3-20的数据。要求用pandas导入Excel文件的数据。在导入的数据中,用NumPy的insert函数在第3行前面插入一个新行。

  • 编写下面的代码:
code.python
import pandas as pd
import numpy as np
# 读取Excel文件中第一个工作表的数据
df = pd.read_excel('D:/Samples/ch03/02 行操作/03 插入行/水果销量.xlsx', engine='openpyxl')
# 创建要插入的新行数据
new_row_data = ['苹果', 99, 80]
# 使用numpy的insert方法,在第3行前插入新行数据
df = pd.DataFrame(np.insert(df.values, 2, values=new_row_data, axis=0), columns=df.columns)
# 输出修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出插入新行后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   品种 本次销量 上次销量
0  苹果  100    0
1  苹果   56  100
2  苹果   99   80
3  香蕉  150    0
4  樱桃  110    0
5  芒果   15    0
6  苹果   70   56
7  芒果   86   15
8  樱桃   99  110

【知识点扩展】

本例中用NumPy的insert函数实现插入新行的关键代码:

code.python
new_row_data = ['苹果', 99, 80]

df = pd.DataFrame(np.insert(df.values, 2, values=new_row_data, axis=0), columns=df.columns)

NumPy的insert函数的第1个参数指定待插入的是df的所有值,第2个参数指定在第3行前面插入,第3个参数指定插入行的数据,第4个参数axis=0指定插入的是行。该函数返回的是一个NumPy数组,用pandas的DataFrame函数将该NumPy数组转换为DataFrame,赋给df,实现对df的修改。

插入新行的另外一种常见方法是使用DataFrame的append方法。该方法首先根据要插入的位置按行将原数据分为两个部分,给上面部分追加新列得到新的DataFrame,再把该DataFrame跟下面部分拼接起来实现插入行的效果。

使用append方法实现插入行使用类似下面的代码。

code.python
import pandas as pd
# 定义文件路径
file_path = 'D:/Samples/ch03/02 行操作/03 插入行/水果销量.xlsx'
# 使用pandas的read_excel方法读取Excel文件的第一个工作表数据
df = pd.read_excel(file_path, sheet_name=0, engine='openpyxl')
# 在第3行之前插入一行
new_row = pd.Series(['苹果', 99, 80], index=df.columns) # 创建新行Series,数据为['苹果',99,80]
df = df[:2].append(new_row, ignore_index=True).append(df[2:], ignore_index=True) # 将新行插入到第3行之前
# 输出修改后的表数据
print(df)

注意DataFrame中行的切片方式。df[:2]表示第3行前面的所有行,df[2:]表示第3行及后面的所有行。

更改行名

【问题描述】

修改DataFrame中行的名称。

【示例3-23】

本例使用与示例3-21相同的数据。要求用pandas导入Excel文件的前5行数据,将“姓名”列作为索引列。在导入的数据中,将行名“王慧琴”改为“王琴”。

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件中第一个工作表的数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/02 行操作/04 更改行名/考试成绩.xlsx', engine='openpyxl', sheet_name=0)
# 将“姓名”列作为索引列
df.set_index('姓名', inplace=True)
# 将行名“王慧琴”改为“王琴”
df.rename(index={'王慧琴':'王琴'}, inplace=True)
# 输出修改后的表数据
print(df.head(5))

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出修改行名后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     语文  数学   英语  政治  历史
姓名
徐慧   85  54   92  50  90
王琴   90  73  118  89  77
章思思  95  83   62  49  49
阮锦绣  92  91   89  84  74
周洪宇  93  92  113  66  66

【知识点扩展】

使用DataFrame对象的rename方法可以同时更改多个行名。例如,下面两行代码都可以实现将行名“王慧琴”改为“王琴”,将行名“阮锦绣”改为“阮华章”。

code.python
df.rename({'王慧琴':'王琴','阮锦绣':'阮华章'},axis='index', inplace=True)
df.rename(index={'王慧琴':'王琴','阮锦绣':'阮华章'}, inplace=True)

更改行数据

【问题描述】

更改DataFrame中指定行的整行数据。

【示例3-24】

本例使用与示例3-21相同的数据。要求用pandas导入Excel文件的前5行数据,将“姓名”列作为索引列。在导入的数据中,将行名为“王慧琴”的行的每个数据加2分。

  • 编写下面的代码:
code.python
# 导入 Pandas 模块
import pandas as pd
# 读取 Excel 文件
file_path = 'D:/Samples/ch03/02 行操作/05 更改行数据/考试成绩.xlsx'
df = pd.read_excel(file_path, sheet_name=0, engine='openpyxl', index_col='姓名', nrows=5)
# 将名为“王慧琴”的行每个数据加2分
df.loc['王慧琴'] += 2
# 输出修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出修改后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     语文  数学   英语  政治  历史
姓名
徐慧   85  54   92  50  90
王慧琴  92  75  120  91  79
章思思  95  83   62  49  49
阮锦绣  92  91   89  84  74
周洪宇  93  92  113  66  66

【知识点扩展】

修改行数据,也可以使用DataFrame对象的loc方法获取指定行后,直接用列表指定该行的新数据。例如下面更改df中第2行数据:

code.python
df.loc[1]=['NM2','企划部',3200]

删除行

【问题描述】

删除DataFrame中的指定行。

【示例3-25】

本例使用与示例3-20相同的数据。要求用pandas导入Excel文件的数据。在导入的数据中,删除第3行。

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件并指定引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/02 行操作/06 删除行/水果销量.xlsx', engine='openpyxl')
# 使用pandas.drop()方法删除第3行,注意行索引从0开始
df = df.drop(2)
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出删除第3行后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   品种  本次销量  上次销量
0  苹果   100     0
1  苹果    56   100
3  樱桃   110     0
4  芒果    15     0
5  苹果    70    56
6  芒果    86    15
7  樱桃    99   110

【知识点扩展】

使用DataFrame对象的drop方法可以删除行或列,当axis参数的值为0时删除行,值为1时删除列。默认时axis=0。

注意,本例中

code.python
df = df.drop(2)

代码中drop方法的参数2表示的是行号,而不是第3行。比如把代码修改成下面这样,执行时就会出错。

code.python
import pandas as pd
# 读取Excel文件并指定引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/02 行操作/06 删除行/水果销量.xlsx', engine='openpyxl')
# 使用pandas.drop()方法删除第3行,注意行索引从0开始
df = df.drop(2)
df = df.drop(2)    #执行到这行时出错
print(df)

代码执行到第2个df = df.drop(2)语句时出错,因为行号为2的行已经被删除了,df中再没有行号为2的行。

使用DataFrame对象的dropna方法可以删除空行。

使用DataFrame对象的drop_duplicates方法可以删除重复行。

dropna方法和drop_duplicates方法将在第9章介绍数据预处理时详细介绍。